#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>

using namespace std;

template<class T>
using func_t = function<void(T)>;

// 封装线程库
template<class T> 
class Thread
{
public:
    Thread(string threadName, func_t<T> func,T data)
        : _threadName(threadName), _pid(0), _func(func), _isRunning(false),_data(data)
    {}

    static void *threadRoution(void *arg) // 声明为静态成员，否则会有隐藏的this指针
    {
        Thread *ts = static_cast<Thread*>(arg);
        ts->_func(ts->_data);
        return nullptr;
    }

    void Start() // 创建线程
    {
        if (!_isRunning) // 不在运行则创建
        {
            _isRunning = true;
            pthread_create(&_pid, nullptr, threadRoution, this); // 传入this指针，以便调用成员中的回调函数
        }
    }

    bool join() // 等待线程
    {
        if (!_isRunning)
            return false;
        int n = pthread_join(_pid, nullptr);
        if (n == 0)
            return true;
        return false;
    }

    ~Thread()
    {}

    string getThreadName()
    {
        return _threadName;
    }

    int getThreadId()
    {
        return _pid;
    }

    bool isRunning()
    {
        return _isRunning;
    }

private:
    string _threadName;
    pthread_t _pid;
    func_t<T> _func;
    bool _isRunning;
    T _data; //线程函数的参数
};